package com.lutzyt.delivery.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.io.Serializable;

/**
 * @Author: zyt
 */
public interface AuditService <T> extends IService<T> {

  String AUDIT_FIELD = "audit";
  String INIT_VALUE = "INIT";
  String PASS_VALUE = "PASS";
  String NO_PASS_VALUE = "NO_PASS";
  String NO_INIT_MESSAGE = "该记录以处理，请不要重复处理";
  String DELETE_FIELD = "deleted";
  String PRIMARY_KEY = "id";
  String DELETE_VALUE = "0";

  /**
   * 未审核的分页
   * @param pageNum
   * @param pageSize
   * @return
   */
  default Page<T> auditPage(Integer pageNum, Integer pageSize) {
    QueryWrapper<T> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq(getDeleteField(), getDeleteValue());
    queryWrapper.eq(getAuditField(), getInitValue());
    final Page<T> page = page(new Page<>(pageNum, pageSize), queryWrapper);
    return page;
  }

  /**
   * 审核通过
   * @param id
   */
  default void pass(Serializable id) {
    final T t = query().eq(getAuditField(), getInitValue()).eq(getPrimaryKey(), id).one();
    if (t == null){
      throw new RuntimeException(getNoInitMessage());
    }
    update().set(getAuditField(), getPassValue()).eq(getPrimaryKey(), id).update();
  }

  /**
   * 审核不通过
   * @param id
   */
  default void noPass(Serializable id) {
    final T t = query().eq(getAuditField(), getInitValue()).eq(getPrimaryKey(), id).one();
    if (t == null){
      throw new RuntimeException(getNoInitMessage());
    }
    update().set(getAuditField(), getNoPassValue()).eq(getPrimaryKey(), id).update();
  }
  /**
   * 逻辑删除的字段
   * @return
   */
  default String getDeleteField(){
    return DELETE_FIELD;
  }
  /**
   * 数据库存储审核的字段
   * @return
   */
  default String getAuditField(){
    return AUDIT_FIELD;
  }

  /**
   * 初始值
   * @return
   */
  default String getInitValue(){
    return INIT_VALUE;
  }
  /**
   * 审核通过的值
   * @return
   */
  default String getPassValue(){
    return PASS_VALUE;
  }
  /**
   * 审核不通过的值
   * @return
   */
  default String getNoPassValue(){
    return NO_PASS_VALUE;
  }
  /**
   * 已审核的提示
   * @return
   */
  default String getNoInitMessage(){
    return NO_INIT_MESSAGE;
  }
  /**
   * 主键
   * @return
   */
  default String getPrimaryKey(){
    return PRIMARY_KEY;
  }
  /**
   * 逻辑删除值
   * @return
   */
  default String getDeleteValue(){
    return DELETE_VALUE;
  }

}
